import { Injectable, Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import * as tencentcloud from 'tencentcloud-sdk-nodejs';
// 引入 SES 模块及类型
import { Client } from 'tencentcloud-sdk-nodejs/tencentcloud/services/ses/v20201002/ses_client';
// 引入腾讯云邮件模块
const SmsClient = tencentcloud.ses.v20201002.Client;

@Injectable()
export class EmailService {
  private readonly client: Client;
  private readonly logger = new Logger(EmailService.name);
  private readonly sender: string;
  private readonly fromName: string;

  constructor(private configService: ConfigService) {
    // 初始化腾讯云客户端
    this.client = new SmsClient({
      credential: {
        secretId: this.configService.get('tencent.ses.secretId'),
        secretKey: this.configService.get('tencent.ses.secretKey'),
      },
      region: this.configService.get('tencent.ses.region'),
      profile: {
        httpProfile: {
          endpoint: 'ses.tencentcloudapi.com',
        },
      },
    });

    // 获取邮件配置
    this.sender = this.configService.get('tencent.ses.sender') || '';
    this.fromName = this.configService.get('tencent.ses.name') || '系统通知';
  }


  // client.BatchSendEmail 批量发送TEXT或者HTML邮件
  
  /**
   * 使用模板发送邮件（支持动态参数替换）
   * @param to 收件人邮箱（单个或多个）
   * @param subject 邮件主题（部分模板可能需要主题，部分由模板定义）
   * @param templateParams 模板参数（键值对，替换模板中的变量）
   * @param templateId 模板ID（可选，默认使用环境变量中的配置）
   */
  async sendTemplateEmail(
    to: string | string[],
    subject: string,
    templateParams: Record<string, string>,
    templateId?: string,
  ): Promise<{ success: boolean; messageId?: string; error?: string }> {
    try {
      const actualTemplateId = templateId ;
      if (!actualTemplateId) {
        throw new Error('模板ID不能为空');
      }
      if (!this.sender) {
        throw new Error('发件人邮箱未配置');
      }

      const toAddresses = Array.isArray(to) ? to : [to];
      const templateData = Object.entries(templateParams).map(([key, value]) => ({
        Key: key,
        Value: value,
      }));

      // 声明请求参数类型（使用 SDK 导出的 Request 类型）
      const requestParams = {
        FromEmailAddress: this.sender, // 发件人邮箱
        FromName: this.fromName, // 发件人别名
        Destination: toAddresses, // 收件人邮箱
        Subject: subject, // 邮件主题
        /**
         * 邮件的“回复”电子邮件地址。可以填写您能收到邮件的邮箱地址，可以是个人邮箱。如果不填，收件人的回复邮件将会发送失败。
         */
        // ReplyToAddresses: [this.sender],
        Template:{
          TemplateID: +actualTemplateId,
          TemplateData: JSON.stringify(templateData),
        }
      };

      const result = await this.client.SendEmail(requestParams);
      this.logger.log(`模板邮件发送成功，消息ID: ${result.MessageId}`);
      return { success: true, messageId: result.MessageId };
    } catch (error) {
      const errorMsg = `模板邮件发送失败: ${error.message}`;
      this.logger.error(errorMsg, error.stack);
      return { success: false, error: errorMsg };
    }
  }

}